home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 11 / Cream of the Crop 11-2.iso / os2 / rsynth1.zip / getarg.c < prev    next >
Text File  |  1995-12-17  |  5KB  |  197 lines

  1. #include <config.h>
  2. /* $Id: getarg.c,v 1.13 1994/11/08 13:30:50 a904209 Exp a904209 $
  3.  */
  4. char *getarg_id = "$Id: getarg.c,v 1.13 1994/11/08 13:30:50 a904209 Exp a904209 $";
  5. #if defined(__STDC__)
  6. #include <stdarg.h>
  7. #else
  8. #include <varargs.h>
  9. #endif
  10.  
  11. #include <stdio.h>
  12. #include <ctype.h>
  13. #include <useconfig.h>
  14. #include "proto.h"
  15. #include "getargs.h"
  16.  
  17. int help_only = 0;
  18.  
  19. /*
  20.    Usage is like :
  21.  
  22.    argc = getargs("Module",argc,argv,
  23.    "r", "%d", &rate,               "Integer",
  24.    "u", "",   &ufile_name,         "String",
  25.    "g", "%d", &gain,               "Double",
  26.    "a", NULL, &use_audio,          "Boolean -a toggles, +a sets",
  27.    "s", ""  , &speaker,            "Booelan -s clears, +s sets",
  28.    NULL);
  29.  
  30.  */
  31.  
  32.  
  33. #if defined(__STDC__)
  34. int
  35. getargs(char *module,int argc, char *argv[],...)
  36. #else
  37. int
  38. getargs(module, argc, argv, va_alist)
  39. char *module;
  40. int argc;
  41. char *argv[];
  42. va_dcl
  43. #endif
  44. {
  45.  va_list ap;
  46.  int i = 0;
  47.  int done_module = 0;
  48.  while (i < argc)
  49.   {
  50.    char *s = argv[i];
  51.    int flag = *s++;
  52.    if (*s && (flag == '-' || flag == '+'))
  53.     {
  54.      int off = 1;
  55.      while (*s)
  56.       {
  57.        char *a;
  58.        int count = 0;
  59. #if defined(__STDC__)
  60.        va_start(ap, argv);
  61. #else
  62.        va_start(ap);
  63. #endif
  64.        while ((a = va_arg(ap, char *)))
  65.         {
  66.          int l = strlen(a);
  67.          char *fmt = va_arg(ap, char *);
  68.          void *var = va_arg(ap, void *);
  69.          char *desc = va_arg(ap, char *);
  70.          if (!strcmp(s,"-help"))
  71.           {
  72.            help_only = 1;
  73.            if (!done_module++)
  74.             fprintf(stderr,"%s:\n",module);
  75.            if (fmt)
  76.             {char *x = strchr(fmt,'%');
  77.              if (x)
  78.               {
  79.                fprintf(stderr," -%s <%s> [",a,x+1);
  80.                switch(*(x+strlen(x)-1))
  81.                 {
  82.                  case 'e':
  83.                  case 'f':
  84.                  case 'g':
  85.                   fprintf(stderr,fmt,*((double *) var));
  86.                   break;
  87.                  case 'u':
  88.                  case 'd':
  89.                   if (x[1] == 'l')
  90.                    fprintf(stderr,fmt,*((long *) var));
  91.                   else
  92.                    fprintf(stderr,fmt,*((int *) var));
  93.                   break;
  94.                 }
  95.                fprintf(stderr,"]\t%s\n",desc);
  96.               }
  97.              else
  98.               fprintf(stderr," -%s <string> [%s]\t%s\n",a,
  99.                       *((char **) var) ? *((char **) var) : "", desc);
  100.             }
  101.            else
  102.             {
  103.              fprintf(stderr," [+|-]%s [%s]\t%s\n",a,
  104.                      *((int *) var) ? "yes" : "no",desc);
  105.             }
  106.           }
  107.          else if (l > 1)
  108.           {
  109.            if (!count && !strcmp(s, a))
  110.             {
  111.              if (fmt)
  112.               {
  113.                if (i + off < argc)
  114.                 {
  115.                  char *x = argv[i + off++];
  116.                  if (strchr(fmt, '%'))
  117.                   {
  118.                    if (sscanf(x, fmt, var) != 1)
  119.                     fprintf(stderr, "%s : %s invalid after -%s\n", argv[0], x, a);
  120.                   }
  121.                  else
  122.                   *((char **) var) = x;
  123.                 }
  124.                else
  125.                 fprintf(stderr, "%s : no argument after -%s\n", argv[0], a);
  126.               }
  127.              else
  128.               {
  129.                if (flag == '+')
  130.                 *((int *) var) = !0;
  131.                else
  132.                 *((int *) var) = !*((int *) var);
  133.               }
  134.              /* skip to end of string */
  135.              count++;
  136.              s += l;
  137.              break;               /* out of va_arg loop */
  138.             }
  139.           }
  140.          else
  141.           {
  142.            if (*s == *a)
  143.             {
  144.              if (fmt)
  145.               {
  146.                if (i + off < argc)
  147.                 {
  148.                  char *x = argv[i + off++];
  149.                  if (strchr(fmt, '%'))
  150.                   {
  151.                    if (sscanf(x, fmt, var) != 1)
  152.                     fprintf(stderr, "%s : %s invalid after -%s\n", argv[0], x, a);
  153.                   }
  154.                  else
  155.                   *((char **) var) = x;
  156.                 }
  157.                else
  158.                 fprintf(stderr, "%s : no argument after -%s\n", argv[0], a);
  159.               }
  160.              else
  161.               {
  162.                if (fmt || flag == '+')
  163.                 *((int *) var) = (flag == '+');
  164.                else
  165.                 *((int *) var) = !*((int *) var);
  166.               }
  167.              count++;
  168.              s++;
  169.              break;               /* out of va_arg loop */
  170.             }
  171.           }
  172.         }
  173.        va_end(ap);
  174.        if (!count)
  175.         {
  176.          off = 0;
  177.          break;                   /* Out of s loop */
  178.         }
  179.       }
  180.      if (off != 0)
  181.       {
  182.        int j;
  183.        argc -= off;
  184.        for (j = i; j <= argc; j++)
  185.         argv[j] = argv[j + off];
  186.       }
  187.      else
  188.       i++;
  189.     }
  190.    else
  191.     i++;
  192.   }
  193.  if (help_only && done_module)
  194.   fprintf(stderr,"\n");
  195.  return argc;
  196. }
  197.